﻿using System;
using System.Collections.Generic;

namespace PnFramework.Unity
{
    /*
     有了单例基类 我们就可以通过继承的方式扩展一个弹幕管理器（DanmuMgr）来封装所有的弹幕互动相关的代码
    */
    /// <summary>
    /// 弹幕管理器
    /// </summary>
    public class DanMuMgr : Singleton<DanMuMgr>
    {
        private class LiveData
        {
            public DanMuData data;
        }
        [Serializable]
        private class DanMuData
        {
            public List<RoomData> room;
        }
        [Serializable]
        public class RoomData
        {
            public int uid;
            public string text;
            public string nickname;
            public string timeline;
        }
        //首先得有存储弹幕来源的URL字符串 和一个存储当前时间线的信息容器
        private string mUrl;
        private string mTimeline;
        private Timer mTimer;
        /// <summary>
        /// 链接直播间
        /// </summary>
        /// <param name="roomID">房间号</param>
        public void LinkLive(string roomID)
        {
            /*
             大家好 我是猫叔 还记得我们之前做的弹幕管理器吗？
             最初的方案是在Update中不断检测弹幕列表是否更新了新的弹幕，
             因为每帧都要向b站直播间发起 Request 请求 还需要不断的序列化数据 
             当弹幕更新量较少的时候 会获取到很多无效数据，这是非常消耗性能，
             所以我们可以通过增加计时器 让弹幕系统每隔一段时间获取一次数据 并处理对应的弹幕信息。
             */
            mTimer = TimerMgr.Instance.AddTimer(RefreshInstruction, 2f, true);
            mUrl = "https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory?roomid=" + roomID;
        }
        /// <summary>
        /// 刷新指令
        /// </summary>
        private void RefreshInstruction()
        {
            //写一个刷新指令的方法 首先解析一下URL中的json数据 获取到room列表
            var liveRoom = HttpWebKit.GetWebJsonToObject<LiveData>(mUrl).data.room;
            if (liveRoom.Count == 0) return;
            int index = liveRoom.Count - 1;
            if (mTimeline == null) mTimeline = liveRoom[index].timeline;// 3
            int i = index;// 9 8 7 6 5 4 3 2 1
            //比对一下当前缓存的时间戳与直播间最后一条弹幕的时间戳是否相等
            while (true) if (mTimeline == liveRoom[i--].timeline) break;
            //转发最新的弹幕信息给其他对象 
            while (i < index) EventMgr.Instance.Trigger("RefreshDanmu", liveRoom[++i]);
            //更新时间戳
            mTimeline = liveRoom[index].timeline;
        }
    }
}